package com.hy.study.practice.queue;

import java.util.Scanner;

/**
 * 使用数组实现一个单向队列
 */
public class OneWayArrayQueue {
    public static void main(String[] args) {
        ArrayQueue queue = new ArrayQueue(4);
        char type = ' ';
        Scanner scanner = new Scanner(System.in);
        try {
            for (; ; ) {
                System.out.println("------请选择操作------");
                System.out.println("a(add) 添加数据");
                System.out.println("g(get) 得到数据");
                System.out.println("h(head) 获取头数据");
                System.out.println("s(show) 展示元素列表");
                System.out.println("e(exit) 退出程序");
                type = scanner.next().charAt(0);
                switch (type) {
                    case 'a':
                        System.out.println("请输入添加的元素:");
                        int value = scanner.nextInt();
                        queue.addQueue(value);
                        break;
                    case 'g':
                        System.out.println("得到的元素是:" + queue.get());
                        break;
                    case 'h':
                        System.out.println("头元素是:" + queue.head());
                        break;
                    case 's':
                        queue.show();
                        break;
                    case 'e':
                        System.out.println("程序退出");
                        System.exit(0);
                        break;
                    default:
                        break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            scanner.close();
        }
    }
}

/**
 * 定义一个队列  使用数组实现
 */
class ArrayQueue {
    private int front;// 数组的头
    private int rear;//数组的尾部
    private int[] arr;//存放数据的数组
    private int maxSize = 16;//数组的最大长度

    public ArrayQueue(int maxSize) {
        this.maxSize = maxSize;
        arr = new int[maxSize];
        front = -1;
        rear = -1;//这里需要从-1 开始 不然添加自增的时 队列里面存放的数据 比 实际队列少 1个
    }

    public ArrayQueue() {
        arr = new int[maxSize];
        front = -1;
        rear = -1;
    }

    /**
     * 判断队列是否满了
     *
     * @return
     */
    public boolean isFull() {
        return rear == maxSize - 1;
    }

    /**
     * 判断队列是否为空
     *
     * @return
     */
    public boolean isEmpty() {
        return front == rear;
    }

    /**
     * 添加元素到队列
     *
     * @param value
     */
    public void addQueue(int value) {
        if (isFull()) {
            System.out.println("队列已满无法添加元素");
            return;
        }
        rear++;
        arr[rear] = value;

    }

    /**
     * 从队列中获取元素
     *
     * @return
     */
    public int get() {
        if (isEmpty()) {
            throw new RuntimeException("队列为空,无法取数数据");
        }
        front++;
        int value = arr[front];
        return value;
    }

    /**
     * 获取当前队列的头元素
     *
     * @return
     */
    public int head() {
        if (isEmpty()) {
            throw new RuntimeException("队列为空,无法获取元素");
        }
        return arr[front+1];
    }

    /**
     * 展示队列中的所有元素
     */
    public void show() {
        for (int i = 0; i < arr.length; i++) {
            int value = arr[i];
            System.out.printf("arr[%d]=%d\n", i, value);

        }
    }
}
